home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Internet / WWW / httpd_1.5.export / support / dbmdigest.c < prev    next >
C/C++ Source or Header  |  1995-11-09  |  4KB  |  196 lines

  1. /*
  2.  * htpasswd.c: simple program for manipulating password file for NCSA httpd
  3.  * 
  4.  * Rob McCool
  5.  */
  6.  
  7. #include "config.h"
  8. #include "portability.h"
  9.  
  10. #include <sys/types.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <sys/signal.h>
  14. #include <stdlib.h>
  15. #include <time.h>
  16.  
  17. #define LF 10
  18. #define CR 13
  19.  
  20. #define MAX_STRING_LEN 256
  21.  
  22. char *tn;
  23.  
  24. char *strd(char *s) {
  25.     char *d;
  26.  
  27.     d=(char *)malloc(strlen(s) + 1);
  28.     strcpy(d,s);
  29.     return(d);
  30. }
  31.  
  32. void getword(char *word, char *line, char stop) {
  33.     int x = 0,y;
  34.  
  35.     for(x=0;((line[x]) && (line[x] != stop));x++)
  36.         word[x] = line[x];
  37.  
  38.     word[x] = '\0';
  39.     if(line[x]) ++x;
  40.     y=0;
  41.  
  42.     while(line[y++] = line[x++]);
  43. }
  44.  
  45. int getline(char *s, int n, FILE *f) {
  46.     register int i=0;
  47.  
  48.     while(1) {
  49.         s[i] = (char)fgetc(f);
  50.  
  51.         if(s[i] == CR)
  52.             s[i] = fgetc(f);
  53.  
  54.         if((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) {
  55.             s[i] = '\0';
  56.             return (feof(f) ? 1 : 0);
  57.         }
  58.         ++i;
  59.     }
  60. }
  61.  
  62. void putline(FILE *f,char *l) {
  63.     int x;
  64.  
  65.     for(x=0;l[x];x++) fputc(l[x],f);
  66.     fputc('\n',f);
  67. }
  68.  
  69.  
  70. /* From local_passwd.c (C) Regents of Univ. of California blah blah */
  71. static unsigned char itoa64[] =         /* 0 ... 63 => ascii - 64 */
  72.         "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  73.  
  74. to64(s, v, n)
  75.   register char *s;
  76.   register long v;
  77.   register int n;
  78. {
  79.     while (--n >= 0) {
  80.         *s++ = itoa64[v&0x3f];
  81.         v >>= 6;
  82.     }
  83. }
  84.  
  85. #ifdef HEAD_CRYPT
  86. char *crypt(char *pw, char *salt); /* why aren't these prototyped in include */
  87. #endif /* HEAD_CRYPT */
  88.  
  89. #ifdef HEAD_GETPASS
  90. char *getpass(char *prompt);
  91. #endif /* HEAD_GETPASS */
  92.  
  93. void add_password(char *user, FILE *f) {
  94.     char *pw, *cpw, salt[3];
  95.  
  96.     pw = strd(getpass("New password:"));
  97.     if(strcmp(pw,getpass("Re-type new password:"))) {
  98.         fprintf(stderr,"They don't match, sorry.\n");
  99.         if(tn)
  100.             unlink(tn);
  101.         exit(1);
  102.     }
  103.     (void)srand((int)time((time_t *)NULL));
  104.     to64(&salt[0],rand(),2);
  105.     cpw = crypt(pw,salt);
  106.     free(pw);
  107.     fprintf(f,"%s:%s\n",user,cpw);
  108. }
  109.  
  110. void usage() {
  111.     fprintf(stderr,"Usage: htpasswd [-c] passwordfile username\n");
  112.     fprintf(stderr,"The -c flag creates a new file.\n");
  113.     exit(1);
  114. }
  115.  
  116. void interrupted() {
  117.     fprintf(stderr,"Interrupted.\n");
  118.     if(tn) unlink(tn);
  119.     exit(1);
  120. }
  121.  
  122. main(int argc, char *argv[]) {
  123.     FILE *tfp,*f;
  124.     char user[MAX_STRING_LEN];
  125.     char line[MAX_STRING_LEN];
  126.     char l[MAX_STRING_LEN];
  127.     char w[MAX_STRING_LEN];
  128.     char command[MAX_STRING_LEN];
  129.     int found;
  130.  
  131.     printf ("This utility is currently non-functional");
  132.     printf ("\nIt will be completed during the beta phase.\n");
  133.     printf ("For now, use htdigest and std2dbm to create\n");
  134.     printf ("DBM format digest (MD5) files.\n");
  135.     exit (0);
  136.  
  137.     tn = NULL;
  138.     signal(SIGINT,(void (*)())interrupted);
  139.     if(argc == 4) {
  140.         if(strcmp(argv[1],"-c"))
  141.             usage();
  142.         if(!(tfp = fopen(argv[2],"w"))) {
  143.             fprintf(stderr,"Could not open passwd file %s for writing.\n",
  144.                     argv[2]);
  145.             perror("fopen");
  146.             exit(1);
  147.         }
  148.         printf("Adding password for %s.\n",argv[3]);
  149.         add_password(argv[3],tfp);
  150.         fclose(tfp);
  151.         exit(0);
  152.     } else if(argc != 3) usage();
  153.  
  154.     tn = tmpnam(NULL);
  155.     if(!(tfp = fopen(tn,"w"))) {
  156.         fprintf(stderr,"Could not open temp file.\n");
  157.         exit(1);
  158.     }
  159.  
  160.     if(!(f = fopen(argv[1],"r"))) {
  161.         fprintf(stderr,
  162.                 "Could not open passwd file %s for reading.\n",argv[1]);
  163.         fprintf(stderr,"Use -c option to create new one.\n");
  164.         exit(1);
  165.     }
  166.     strcpy(user,argv[2]);
  167.  
  168.     found = 0;
  169.     while(!(getline(line,MAX_STRING_LEN,f))) {
  170.         if(found || (line[0] == '#') || (!line[0])) {
  171.             putline(tfp,line);
  172.             continue;
  173.         }
  174.         strcpy(l,line);
  175.         getword(w,l,':');
  176.         if(strcmp(user,w)) {
  177.             putline(tfp,line);
  178.             continue;
  179.         }
  180.         else {
  181.             printf("Changing password for user %s\n",user);
  182.             add_password(user,tfp);
  183.             found = 1;
  184.         }
  185.     }
  186.     if(!found) {
  187.         printf("Adding user %s\n",user);
  188.         add_password(user,tfp);
  189.     }
  190.     fclose(f);
  191.     fclose(tfp);
  192.     sprintf(command,"cp %s %s",tn,argv[1]);
  193.     system(command);
  194.     unlink(tn);
  195. }
  196.